#ifndef _WX_FONT_H_BASE_
#define _WX_FONT_H_BASE_

// ----------------------------------------------------------------------------
// headers
// ----------------------------------------------------------------------------

#include "wx/defs.h"        // for wxDEFAULT &c
#include "wx/fontenc.h"     // the font encoding constants
#include "wx/gdiobj.h"      // the base class

// ----------------------------------------------------------------------------
// forward declarations
// ----------------------------------------------------------------------------

class wxFontData;
class wxFontBase;
class wxFont;
class wxSize;

enum wxFontFamily {
  wxFONTFAMILY_DEFAULT = wxDEFAULT,
  wxFONTFAMILY_DECORATIVE = wxDECORATIVE,
  wxFONTFAMILY_ROMAN = wxROMAN,
  wxFONTFAMILY_SCRIPT = wxSCRIPT,
  wxFONTFAMILY_SWISS = wxSWISS,
  wxFONTFAMILY_MODERN = wxMODERN,
  wxFONTFAMILY_TELETYPE = wxTELETYPE,
  wxFONTFAMILY_MAX,
  wxFONTFAMILY_UNKNOWN = wxFONTFAMILY_MAX
};

// font styles
enum wxFontStyle {
  wxFONTSTYLE_NORMAL = wxNORMAL,
  wxFONTSTYLE_ITALIC = wxITALIC,
  wxFONTSTYLE_SLANT = wxSLANT,
  wxFONTSTYLE_MAX
};

// font weights
enum wxFontWeight {
  wxFONTWEIGHT_NORMAL = wxNORMAL,
  wxFONTWEIGHT_LIGHT = wxLIGHT,
  wxFONTWEIGHT_BOLD = wxBOLD,
  wxFONTWEIGHT_MAX
};

// the font flag bits for the new font ctor accepting one combined flags word
enum {
  // no special flags: font with default weight/slant/anti-aliasing
  wxFONTFLAG_DEFAULT          = 0,

  // slant flags (default: no slant)
  wxFONTFLAG_ITALIC           = 1 << 0,
  wxFONTFLAG_SLANT            = 1 << 1,

  // weight flags (default: medium)
  wxFONTFLAG_LIGHT            = 1 << 2,
  wxFONTFLAG_BOLD             = 1 << 3,

  // anti-aliasing flag: force on or off (default: the current system default)
  wxFONTFLAG_ANTIALIASED      = 1 << 4,
  wxFONTFLAG_NOT_ANTIALIASED  = 1 << 5,

  // underlined/strikethrough flags (default: no lines)
  wxFONTFLAG_UNDERLINED       = 1 << 6,
  wxFONTFLAG_STRIKETHROUGH    = 1 << 7,

  // the mask of all currently used flags
  wxFONTFLAG_MASK = wxFONTFLAG_ITALIC             |
                    wxFONTFLAG_SLANT              |
                    wxFONTFLAG_LIGHT              |
                    wxFONTFLAG_BOLD               |
                    wxFONTFLAG_ANTIALIASED        |
                    wxFONTFLAG_NOT_ANTIALIASED    |
                    wxFONTFLAG_UNDERLINED         |
                    wxFONTFLAG_STRIKETHROUGH
};

// ----------------------------------------------------------------------------
// wxFontBase represents a font object
// ----------------------------------------------------------------------------

class wxNativeFontInfo;

class wxFontBase : public wxGDIObject {
  public:
    // creator function
    virtual ~wxFontBase();

    // from the font components
    static wxFont *New(
      int pointSize,              // size of the font in points
      int family,                 // see wxFontFamily enum
      int style,                  // see wxFontStyle enum
      int weight,                 // see wxFontWeight enum
      bool underlined = false,    // not underlined by default
      const wxString& face = wxEmptyString,              // facename
      wxFontEncoding encoding = wxFONTENCODING_DEFAULT ); // ISO8859-X, ...

    // from the font components but using the font flags instead of separate
    // parameters for each flag
    static wxFont *New( int pointSize,
                        wxFontFamily family,
                        int flags = wxFONTFLAG_DEFAULT,
                        const wxString& face = wxEmptyString,
                        wxFontEncoding encoding = wxFONTENCODING_DEFAULT );

    // from the font components
    static wxFont *New(
      const wxSize& pixelSize,    // size of the font in pixels
      int family,                 // see wxFontFamily enum
      int style,                  // see wxFontStyle enum
      int weight,                 // see wxFontWeight enum
      bool underlined = false,    // not underlined by default
      const wxString& face = wxEmptyString,              // facename
      wxFontEncoding encoding = wxFONTENCODING_DEFAULT ); // ISO8859-X, ...

    // from the font components but using the font flags instead of separate
    // parameters for each flag
    static wxFont *New( const wxSize& pixelSize,
                        wxFontFamily family,
                        int flags = wxFONTFLAG_DEFAULT,
                        const wxString& face = wxEmptyString,
                        wxFontEncoding encoding = wxFONTENCODING_DEFAULT );

    // from the (opaque) native font description object
    static wxFont *New( const wxNativeFontInfo& nativeFontDesc );

    // from the string representation of wxNativeFontInfo
    static wxFont *New( const wxString& strNativeFontDesc );

    // was the font successfully created?
    bool Ok() const { return IsOk(); }
    bool IsOk() const { return m_refData != NULL; }

    // comparison
    bool operator == ( const wxFont& font ) const;
    bool operator != ( const wxFont& font ) const;

    // accessors: get the font characteristics
    virtual int GetPointSize() const = 0;
    virtual wxSize GetPixelSize() const;
    virtual bool IsUsingSizeInPixels() const;
    virtual int GetFamily() const = 0;
    virtual int GetStyle() const = 0;
    virtual int GetWeight() const = 0;
    virtual bool GetUnderlined() const = 0;
    virtual wxString GetFaceName() const = 0;
    virtual wxFontEncoding GetEncoding() const = 0;
    virtual const wxNativeFontInfo *GetNativeFontInfo() const = 0;

    virtual bool IsFixedWidth() const;

    wxString GetNativeFontInfoDesc() const;
    wxString GetNativeFontInfoUserDesc() const;

    // change the font characteristics
    virtual void SetPointSize( int pointSize ) = 0;
    virtual void SetPixelSize( const wxSize& pixelSize );
    virtual void SetFamily( int family ) = 0;
    virtual void SetStyle( int style ) = 0;
    virtual void SetWeight( int weight ) = 0;
    virtual void SetUnderlined( bool underlined ) = 0;
    virtual void SetEncoding( wxFontEncoding encoding ) = 0;
    virtual bool SetFaceName( const wxString& faceName );
    void SetNativeFontInfo( const wxNativeFontInfo& info ) { DoSetNativeFontInfo( info ); }

    bool SetNativeFontInfo( const wxString& info );
    bool SetNativeFontInfoUserDesc( const wxString& info );

    // translate the fonts into human-readable string (i.e. GetStyleString()
    // will return "wxITALIC" for an italic font, ...)
    wxString GetFamilyString() const;
    wxString GetStyleString() const;
    wxString GetWeightString() const;

    // Unofficial API, don't use
    virtual void SetNoAntiAliasing( bool no = true ) {  }
    virtual bool GetNoAntiAliasing() const { return false; }

    // the default encoding is used for creating all fonts with default
    // encoding parameter
    static wxFontEncoding GetDefaultEncoding() { return ms_encodingDefault; }
    static void SetDefaultEncoding( wxFontEncoding encoding );

  protected:
    // the function called by both overloads of SetNativeFontInfo()
    virtual void DoSetNativeFontInfo( const wxNativeFontInfo& info );

  private:
    // the currently default encoding: by default, it's the default system
    // encoding, but may be changed by the application using
    // SetDefaultEncoding() to make all subsequent fonts created without
    // specifying encoding parameter using this encoding
    static wxFontEncoding ms_encodingDefault;
};

// include the real class declaration
#include "wx/gtk/font.h"

#endif
